package main

import "fmt"

//构造函数
//标识符：变量名  函数名  类型名  方法名
//Go语言中如果标识符首字母大写的，就表示对外部包可见，（暴露的，公有的）

//Dog 这是一个狗的结构体

type person struct {
	name string
	age  int
}

type dog struct {
	name string
}

func newDog(name string) dog {
	return dog{
		name: name,
	}
}

//值传递，传值
func (p person) guonian() {
	p.age++
}

//指针接受者,传内存地址过去
func (p *person) zhenguonian() {
	p.age++
}

func (p *person) dream() {
	fmt.Println("发财梦")
}

func newPerson(name string, age int) *person {
	return &person{
		name: name,
		age:  age,
	}
}

//方法是作用于特定类型的函数
//接受者表示的是调用方法的具体类型变量，多用类型名首字母小写表示
func (d dog) wang() {
	fmt.Printf("%s:汪汪汪 \n", d.name)
}

func main() {
	d1 := newDog("qwe")
	fmt.Println(d1)
	d1.wang()

	p1 := newPerson("asd", 120)
	fmt.Printf("%T\n", p1)
	fmt.Printf("%v\n", p1)
	//p1.wang()

	fmt.Println(p1.age)
	p1.guonian()
	fmt.Println(p1.age)

	p1.zhenguonian()
	fmt.Println(p1.age)
	p1.dream()

}
